Visaptveroša rokasgrāmata par satura drošības politiku (CSP) un citām frontend galvenēm, lai aizsargātu tīmekļa lietotnes no uzbrukumiem un uzlabotu lietotāju drošību.
Frontend drošības galvenes: Satura drošības politikas (CSP) apgūšana
Mūsdienu digitālajā vidē, kur tīmekļa lietojumprogrammas kļūst arvien sarežģītākas un savstarpēji saistītas, aizsardzība pret drošības apdraudējumiem ir vissvarīgākā. Lai gan backend drošībai bieži tiek pievērsta liela uzmanība, frontend drošība ir tikpat būtiska. Frontend drošības galvenes darbojas kā pirmā aizsardzības līnija, nodrošinot mehānismu, kas pārlūkprogrammai norāda, kā rīkoties, un aizsargā lietotājus no dažādiem uzbrukumiem. Starp šīm galvenēm Satura drošības politika (CSP) izceļas kā spēcīgs rīks plaša risku spektra mazināšanai.
Kas ir frontend drošības galvenes?
Frontend drošības galvenes ir HTTP atbildes galvenes, kuras tīmekļa serveris nosūta pārlūkprogrammai. Šīs galvenes satur norādījumus par to, kā pārlūkprogrammai jārīkojas ar saņemto saturu. Tās palīdz novērst tādus izplatītus uzbrukumus kā:
- Starpvietņu skriptošana (XSS): Ļaunprātīgu skriptu ievadīšana uzticamās vietnēs.
- Klikšķu nolaupīšana (Clickjacking): Lietotāju maldināšana, lai viņi noklikšķinātu uz kaut kā cita, nekā viņi uztver.
- "Cilvēks pa vidu" uzbrukumi (Man-in-the-Middle Attacks): Saziņas pārtveršana starp lietotāju un serveri.
Dažas no svarīgākajām frontend drošības galvenēm ir:
- Content Security Policy (CSP): Definē avotus, no kuriem pārlūkprogrammai ir atļauts ielādēt resursus.
- Strict-Transport-Security (HSTS): Liek pārlūkprogrammai izmantot HTTPS visai saziņai ar vietni.
- X-Frame-Options: Novērš vietnes iegulšanu iframe, mazinot klikšķu nolaupīšanas uzbrukumus.
- X-XSS-Protection: Iespējo pārlūkprogrammas iebūvēto XSS filtru. (Piezīme: bieži aizstāts ar CSP, bet joprojām var nodrošināt aizsardzības slāni).
- Referrer-Policy: Kontrolē ar pieprasījumiem nosūtītās atsauces informācijas apjomu.
- Feature-Policy (tagad Permissions-Policy): Ļauj izstrādātājiem selektīvi iespējot un atspējot pārlūkprogrammas funkcijas un API.
Padziļināta ielūkošanās Satura drošības politikā (CSP)
Satura drošības politika (CSP) ir HTTP atbildes galvene, kas kontrolē resursus, kurus lietotāja aģentam ir atļauts ielādēt konkrētai lapai. Tā būtībā veido apstiprināta satura avotu "balto sarakstu", ievērojami samazinot XSS uzbrukumu risku. Skaidri definējot izcelsmes vietas, no kurām var ielādēt tādus resursus kā skriptus, stila lapas, attēlus un fontus, CSP ievērojami apgrūtina uzbrucējiem ļaunprātīga koda ievadīšanu jūsu vietnē.
Kā darbojas CSP
CSP darbojas, nodrošinot pārlūkprogrammai apstiprinātu avotu sarakstu dažādiem satura veidiem. Kad pārlūkprogramma sastopas ar resursu, kas pārkāpj CSP, tā bloķē resursu un ziņo par pārkāpumu. Šis bloķēšanas mehānisms novērš ļaunprātīga koda izpildi, pat ja uzbrucējam izdodas to ievadīt HTML.
CSP direktīvas
CSP direktīvas ir CSP politikas pamatkomponenti. Tās norāda atļautos avotus dažāda veida resursiem. Dažas no visbiežāk izmantotajām direktīvām ir:
- default-src: Iestata noklusējuma avotu visiem resursu veidiem. Šī ir rezerves direktīva, kas tiek piemērota, ja citas, specifiskākas direktīvas nav definētas.
- script-src: Norāda atļautos avotus JavaScript.
- style-src: Norāda atļautos avotus CSS stila lapām.
- img-src: Norāda atļautos avotus attēliem.
- font-src: Norāda atļautos avotus fontiem.
- media-src: Norāda atļautos avotus audio un video.
- object-src: Norāda atļautos avotus spraudņiem, piemēram, Flash. (Parasti vislabāk ir izvairīties no spraudņu atļaušanas, ja iespējams).
- frame-src: Norāda atļautos avotus rāmjiem (iframes).
- connect-src: Norāda atļautos avotus tīkla pieprasījumiem (AJAX, WebSockets).
- base-uri: Ierobežo URL, kurus var izmantot
<base>elementā. - form-action: Ierobežo URL, uz kuriem var iesniegt veidlapas.
- frame-ancestors: Norāda derīgus vecākelementus, kas var iegult lapu, izmantojot
<frame>,<iframe>,<object>,<embed>vai<applet>. Šī direktīva nodrošina aizsardzību pret klikšķu nolaupīšanu. - upgrade-insecure-requests: Norāda lietotāja aģentiem uzskatīt visus vietnes nedrošos URL (ielādētus, izmantojot HTTP) tā, it kā tie būtu aizstāti ar drošiem URL (ielādētiem, izmantojot HTTPS). Šī direktīva ir paredzēta vietnēm, kas ir pārejas procesā no HTTP uz HTTPS.
- report-uri: Norāda URL, uz kuru pārlūkprogrammai jāsūta ziņojumi par CSP pārkāpumiem. Novecojusi par labu `report-to`.
- report-to: Norāda grupas nosaukumu, kas definēts `Report-To` galvenē. Tas nodrošina smalkāku kontroli pār ziņošanu, tostarp norādot vairākus ziņošanas galapunktus.
CSP avota vērtības
Avota vērtības nosaka izcelsmes vietas, no kurām atļauts ielādēt resursus. Dažas izplatītas avota vērtības ir:
- *: Atļauj saturu no jebkura avota (Izvairieties to izmantot produkcijā!).
- 'self': Atļauj saturu no tās pašas izcelsmes (shēma, resursdators un ports) kā aizsargātais dokuments.
- 'none': Neļauj saturu no neviena avota.
- 'unsafe-inline': Atļauj izmantot iekļauto JavaScript un CSS (Izvairieties to izmantot produkcijā!).
- 'unsafe-eval': Atļauj izmantot dinamisko koda novērtēšanu (piemēram,
eval(),Function()) (Izvairieties to izmantot produkcijā!). - 'strict-dynamic': Norāda, ka uzticība, kas skaidri dota skriptam, kurš atrodas iezīmē, pievienojot tam nonce vai jaucējkodu, tiek pārnesta uz visiem skriptiem, ko ielādējis šis priekštecis.
- 'unsafe-hashes': Atļauj konkrētus iekļautos notikumu apstrādātājus. To parasti neiesaka tā sarežģītības un ierobežotā ieguvuma dēļ.
- data:: Atļauj ielādēt resursus no datu URL (piemēram, iegultiem attēliem). Lietojiet piesardzīgi.
- mediastream:: Atļauj izmantot `mediastream:` URI kā multivides avotu.
- blob:: Atļauj izmantot `blob:` URI kā multivides avotu.
- filesystem:: Atļauj ielādēt resursus no failu sistēmas.
- https://example.com: Atļauj saturu no konkrēta domēna un porta.
- *.example.com: Atļauj saturu no jebkura example.com apakšdomēna.
- nonce-{random-value}: Atļauj skriptus vai stilus ar atbilstošu nonce atribūtu. Tam nepieciešama nejaušas nonce vērtības ģenerēšana servera pusē katram pieprasījumam.
- sha256-{hash-value}: Atļauj skriptus vai stilus ar atbilstošu SHA256, SHA384 vai SHA512 jaucējkodu.
CSP režīmi: Izpildes vs. Tikai ziņošanas
CSP var ieviest divos režīmos:
- Izpildes režīms: Šajā režīmā pārlūkprogramma bloķē visus resursus, kas pārkāpj CSP. Šis ir ieteicamais režīms produkcijas vidēm. CSP tiek nosūtīts, izmantojot `Content-Security-Policy` galveni.
- Tikai ziņošanas režīms: Šajā režīmā pārlūkprogramma ziņo par CSP pārkāpumiem, bet nebloķē resursus. Tas ir noderīgi, lai testētu un novērtētu CSP pirms tās piemērošanas. CSP tiek nosūtīts, izmantojot `Content-Security-Policy-Report-Only` galveni.
CSP ieviešana: Soli pa solim
CSP ieviešana var šķist biedējoša, bet, sekojot strukturētai pieejai, jūs varat efektīvi nodrošināt savu tīmekļa lietojumprogrammu.
1. Sāciet ar tikai ziņošanas politiku
Sāciet, ieviešot CSP tikai ziņošanas režīmā. Tas ļauj jums uzraudzīt pārkāpumus, netraucējot jūsu vietnes funkcionalitāti. Konfigurējiet report-uri vai report-to direktīvu, lai nosūtītu pārkāpumu ziņojumus uz norādīto galapunktu.
Piemēra galvene (tikai ziņošanai):
Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report
2. Analizējiet pārkāpumu ziņojumus
Rūpīgi analizējiet pārkāpumu ziņojumus, lai noteiktu, kuri resursi tiek bloķēti un kāpēc. Tas palīdzēs jums izprast jūsu vietnes resursu atkarības un identificēt potenciālās drošības ievainojamības.
Pārkāpumu ziņojumi parasti tiek nosūtīti kā JSON pakotnes uz konfigurēto report-uri vai report-to galapunktu. Šie ziņojumi satur informāciju par pārkāpumu, piemēram, bloķēto URI, pārkāpto direktīvu un dokumenta URI.
3. Precizējiet CSP politiku
Pamatojoties uz pārkāpumu ziņojumiem, precizējiet savu CSP politiku, lai atļautu leģitīmus resursus, vienlaikus saglabājot spēcīgu drošības pozīciju. Pievienojiet konkrētas avota vērtības resursiem, kas tiek bloķēti. Apsveriet iespēju izmantot nonces vai jaucējkodus iekļautajiem skriptiem un stiliem, lai izvairītos no 'unsafe-inline' izmantošanas.
4. Pārejiet uz izpildes režīmu
Kad esat pārliecināts, ka jūsu CSP politika nebloķē leģitīmus resursus, pārejiet uz izpildes režīmu. Tas bloķēs visus atlikušos pārkāpumus un nodrošinās spēcīgu drošības slāni pret XSS uzbrukumiem.
Piemēra galvene (izpildes režīms):
Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-uri /csp-report
5. Uzraugiet un uzturiet CSP politiku
CSP nav "iestati un aizmirsti" risinājums. Ir būtiski nepārtraukti uzraudzīt savu CSP politiku un atjaunināt to, kad jūsu vietne attīstās un parādās jauni drošības apdraudējumi. Regulāri pārskatiet pārkāpumu ziņojumus un pēc nepieciešamības pielāgojiet politiku.
Praktiski CSP piemēri
Apskatīsim dažus praktiskus CSP piemērus dažādiem scenārijiem:
1. piemērs: Pamata CSP vienkāršai vietnei
Šis CSP atļauj saturu no tās pašas izcelsmes un atļauj attēlus no jebkura avota.
Content-Security-Policy: default-src 'self'; img-src *
2. piemērs: CSP ar specifiskiem skriptu un stilu avotiem
Šis CSP atļauj skriptus no tās pašas izcelsmes un no konkrēta CDN, un stilus no tās pašas izcelsmes un iekļautos stilus.
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'
3. piemērs: CSP ar Nonces iekļautajiem skriptiem
Šis CSP pieprasa unikālu nonce katram iekļautajam skriptam.
Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-r4nd0mn0nc3'
HTML:
<script nonce="r4nd0mn0nc3">console.log('Hello, world!');</script>
Svarīgi: Nonce vērtībai jābūt dinamiski ģenerētai serverī katram pieprasījumam. Tas novērš uzbrucējiem iespēju atkārtoti izmantot nonce.
4. piemērs: CSP, kas ierobežo Frame Ancestors, lai novērstu klikšķu nolaupīšanu
Šis CSP neļauj lapu iegult iframe jebkurā domēnā, izņemot `https://example.com`.
Content-Security-Policy: frame-ancestors 'self' https://example.com
5. piemērs: Stingrāks CSP, izmantojot 'strict-dynamic' un rezerves variantu 'self'
Šis CSP izmanto `strict-dynamic` modernām pārlūkprogrammām, vienlaikus atbalstot vecākas pārlūkprogrammas, kas to neatbalsta. Tas ietver arī `report-uri` pārkāpumu uzraudzībai.
Content-Security-Policy: default-src 'self'; script-src 'strict-dynamic' 'nonce-{random-nonce}' 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-uri /csp-report
Atcerieties aizstāt `{random-nonce}` ar dinamiski ģenerētu nonce vērtību servera pusē.
CSP un vienas lapas lietojumprogrammas (SPA)
CSP ieviešana SPA var būt sarežģīta šo lietojumprogrammu dinamiskās dabas dēļ. SPA bieži lielā mērā paļaujas uz JavaScript, lai ģenerētu un manipulētu ar DOM, kas var izraisīt CSP pārkāpumus, ja to nerisina uzmanīgi.
Šeit ir daži padomi CSP ieviešanai SPA:
- Izvairieties no
'unsafe-inline'un'unsafe-eval': No šīm direktīvām SPA vajadzētu izvairīties, kad vien iespējams. Tās ievērojami vājina jūsu lietojumprogrammas drošību. - Izmantojiet Nonces vai jaucējkodus: Izmantojiet nonces vai jaucējkodus iekļautajiem skriptiem un stiliem. Šī ir ieteicamā pieeja SPA.
- Apsveriet Trusted Types: Trusted Types ir pārlūkprogrammas API, kas palīdz novērst uz DOM balstītas XSS ievainojamības. To var izmantot kopā ar CSP, lai vēl vairāk uzlabotu drošību.
- Izmantojiet ar CSP saderīgu ietvaru: Daži frontend ietvari (piemēram, React ar specifiskām konfigurācijām, Angular un Vue.js) nodrošina funkcijas, kas palīdz vieglāk ieviest CSP.
Citas svarīgas frontend drošības galvenes
Lai gan CSP ir frontend drošības stūrakmens, citas galvenes spēlē būtisku lomu visaptverošas aizsardzības stratēģijas nodrošināšanā:
Strict-Transport-Security (HSTS)
Strict-Transport-Security (HSTS) galvene norāda pārlūkprogrammai vienmēr izmantot HTTPS, lai izveidotu savienojumu ar vietni. Tas novērš "cilvēks pa vidu" uzbrukumus, kas mēģina pazemināt savienojumu uz HTTP.
Piemēra galvene:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
max-age: Norāda ilgumu (sekundēs), cik ilgi pārlūkprogrammai jāatceras piekļūt vietnei tikai caur HTTPS. Produkcijas vidēm ieteicama vērtība 31536000 sekundes (1 gads).includeSubDomains: Norāda, ka HSTS politika attiecas uz visiem domēna apakšdomēniem.preload: Ļauj domēnu iekļaut HSTS iespējotu domēnu sarakstā, kas ir iepriekš ielādēts pārlūkprogrammās. Lai to izdarītu, jūsu domēns jāiesniedz Google uzturētajā HSTS priekšielādes sarakstā.
X-Frame-Options
X-Frame-Options galvene novērš klikšķu nolaupīšanas uzbrukumus, kontrolējot, vai vietni var iegult iframe.
Piemēra galvene:
X-Frame-Options: DENY
Iespējamās vērtības:
DENY: Neļauj lapu attēlot iframe, neatkarīgi no izcelsmes.SAMEORIGIN: Ļauj lapu attēlot iframe tikai tad, ja iframe izcelsme atbilst lapas izcelsmei.ALLOW-FROM uri: Ļauj lapu attēlot iframe tikai tad, ja iframe izcelsme atbilst norādītajam URI. Piezīme: Šī opcija ir novecojusi un var netikt atbalstīta visās pārlūkprogrammās.
Piezīme: frame-ancestors direktīva CSP nodrošina elastīgāku un jaudīgāku veidu, kā kontrolēt ietvarošanu, un parasti tiek dota priekšroka pār X-Frame-Options.
X-XSS-Protection
X-XSS-Protection galvene iespējo pārlūkprogrammas iebūvēto XSS filtru. Lai gan CSP ir spēcīgāks risinājums XSS uzbrukumu novēršanai, šī galvene var nodrošināt papildu aizsardzības slāni, īpaši vecākām pārlūkprogrammām, kas, iespējams, pilnībā neatbalsta CSP.
Piemēra galvene:
X-XSS-Protection: 1; mode=block
1: Iespējo XSS filtru.0: Atspējo XSS filtru.mode=block: Norāda pārlūkprogrammai bloķēt lapu, ja tiek atklāts XSS uzbrukums.report=uri: Norāda URL, uz kuru pārlūkprogrammai jāsūta ziņojums, ja tiek atklāts XSS uzbrukums.
Referrer-Policy
Referrer-Policy galvene kontrolē ar pieprasījumiem nosūtītās atsauces informācijas apjomu. Atsauces informāciju var izmantot, lai izsekotu lietotājus starp vietnēm, tāpēc tās kontrole var uzlabot lietotāju privātumu.
Piemēra galvene:
Referrer-Policy: strict-origin-when-cross-origin
Dažas izplatītas vērtības:
no-referrer: Nekad nesūtīt Referer galveni.no-referrer-when-downgrade: Nesūtīt Referer galveni uz izcelsmes vietām bez TLS (HTTPS).origin: Sūtīt tikai izcelsmi (shēmu, resursdatoru un portu) Referer galvenē.origin-when-cross-origin: Sūtīt izcelsmi starpizcelsmes pieprasījumiem un pilnu URL tās pašas izcelsmes pieprasījumiem.same-origin: Sūtīt Referer galveni tās pašas izcelsmes pieprasījumiem, bet ne starpizcelsmes pieprasījumiem.strict-origin: Sūtīt tikai izcelsmi, ja protokola drošības līmenis paliek nemainīgs (HTTPS uz HTTPS), bet nesūtīt galveni uz mazāk drošu galamērķi (HTTPS uz HTTP).strict-origin-when-cross-origin: Sūtīt izcelsmi, veicot tās pašas izcelsmes pieprasījumu. Starpizcelsmes pieprasījumiem sūtīt izcelsmi tikai tad, ja protokola drošības līmenis paliek nemainīgs (HTTPS uz HTTPS), bet nesūtīt galveni uz mazāk drošu galamērķi (HTTPS uz HTTP).unsafe-url: Sūtīt pilnu URL Referer galvenē, neatkarīgi no izcelsmes. Lietojiet ar īpašu piesardzību, jo tas var atklāt sensitīvu informāciju.
Permissions-Policy (agrāk Feature-Policy)
Permissions-Policy galvene (agrāk pazīstama kā Feature-Policy) ļauj izstrādātājiem selektīvi iespējot un atspējot pārlūkprogrammas funkcijas un API. Tas var palīdzēt samazināt jūsu lietojumprogrammas uzbrukuma virsmu un uzlabot lietotāju privātumu.
Piemēra galvene:
Permissions-Policy: geolocation=()
Šis piemērs atspējo ģeolokācijas API vietnei.
Citas funkcijas, kuras var kontrolēt ar Permissions-Policy, ietver:
cameramicrophonegeolocationaccelerometergyroscopemagnetometerusbmidipaymentfullscreen
Drošības galveņu iestatīšana dažādās platformās
Drošības galveņu iestatīšanas metode atšķiras atkarībā no izmantotā tīmekļa servera vai platformas. Šeit ir daži izplatīti piemēri:
Apache
Jūs varat iestatīt drošības galvenes Apache, pievienojot tās .htaccess failam vai servera konfigurācijas failam (httpd.conf).
Piemēra .htaccess konfigurācija:
<IfModule mod_headers.c>
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-uri /csp-report"
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Header set X-Frame-Options "DENY"
Header set X-XSS-Protection "1; mode=block"
Header set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
Nginx
Jūs varat iestatīt drošības galvenes Nginx, pievienojot tās servera blokam Nginx konfigurācijas failā (nginx.conf).
Piemēra Nginx konfigurācija:
server {
listen 443 ssl;
server_name example.com;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' 'unsafe-inline'; img-src 'self' data:; report-uri /csp-report";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Frame-Options "DENY";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "strict-origin-when-cross-origin";
...
}
Node.js (Express)
Jūs varat iestatīt drošības galvenes Node.js, izmantojot starpprogrammatūru, piemēram, Helmet.
Piemērs, izmantojot Helmet:
const express = require('express');
const helmet = require('helmet');
const app = express();
app.use(helmet());
// Pielāgojiet CSP, ja nepieciešams
app.use(helmet.contentSecurityPolicy({
directives: {
defaultSrc: ["'self'"],
scriptSrc: ["'self'", "https://cdn.example.com"],
styleSrc: ["'self'", "'unsafe-inline'"],
imgSrc: ["'self'", "data:"],
reportUri: '/csp-report'
},
}));
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
Cloudflare
Cloudflare ļauj iestatīt drošības galvenes, izmantojot Page Rules vai Transform Rules.
Jūsu drošības galveņu testēšana
Pēc drošības galveņu ieviešanas ir svarīgi tās pārbaudīt, lai pārliecinātos, ka tās darbojas pareizi. Vairāki tiešsaistes rīki var palīdzēt analizēt jūsu vietnes drošības galvenes:
- SecurityHeaders.com: Vienkāršs un efektīvs rīks drošības galveņu analīzei.
- Mozilla Observatory: Visaptverošs rīks vietnes drošības, tostarp drošības galveņu, testēšanai.
- WebPageTest.org: Ļauj apskatīt HTTP galvenes ūdenskrituma diagrammā.
Secinājums
Frontend drošības galvenes, īpaši Satura drošības politika (CSP), ir būtiskas, lai aizsargātu tīmekļa lietojumprogrammas no dažādiem uzbrukumiem un uzlabotu lietotāju drošību. Rūpīgi ieviešot un uzturot šīs galvenes, jūs varat ievērojami samazināt XSS, klikšķu nolaupīšanas un citu drošības ievainojamību risku. Atcerieties sākt ar tikai ziņošanas politiku, analizēt pārkāpumu ziņojumus, precizēt politiku un pēc tam pāriet uz izpildes režīmu. Regulāri uzraugiet un atjauniniet savas drošības galvenes, lai jūsu vietne būtu droša, tai attīstoties un parādoties jauniem draudiem.
Pieņemot proaktīvu pieeju frontend drošībai, jūs varat veidot drošākas un uzticamākas tīmekļa lietojumprogrammas, kas aizsargā jūsu lietotājus un jūsu uzņēmumu.